Use p_paddr when loading Elf program segments; not p_vaddr.
Signed-off-by: keir.fraser@cl.cam.ac.uk
phdr = (Elf_Phdr *)(elfbase + ehdr->e_phoff + (h*ehdr->e_phentsize));
if ( !is_loadable_phdr(phdr) )
continue;
- if ( phdr->p_vaddr < kernstart )
- kernstart = phdr->p_vaddr;
- if ( (phdr->p_vaddr + phdr->p_memsz) > kernend )
- kernend = phdr->p_vaddr + phdr->p_memsz;
+ if ( phdr->p_paddr < kernstart )
+ kernstart = phdr->p_paddr;
+ if ( (phdr->p_paddr + phdr->p_memsz) > kernend )
+ kernend = phdr->p_paddr + phdr->p_memsz;
}
if ( (kernstart > kernend) ||
for ( done = 0; done < phdr->p_filesz; done += chunksz )
{
- pa = (phdr->p_vaddr + done) - vstart;
+ pa = (phdr->p_paddr + done) - vstart;
va = xc_map_foreign_range(
xch, dom, PAGE_SIZE, PROT_WRITE, parray[pa>>PAGE_SHIFT]);
chunksz = phdr->p_filesz - done;
for ( ; done < phdr->p_memsz; done += chunksz )
{
- pa = (phdr->p_vaddr + done) - vstart;
+ pa = (phdr->p_paddr + done) - vstart;
va = xc_map_foreign_range(
xch, dom, PAGE_SIZE, PROT_WRITE, parray[pa>>PAGE_SHIFT]);
chunksz = phdr->p_memsz - done;
phdr = (Elf_Phdr *)(elfbase + ehdr->e_phoff + (h*ehdr->e_phentsize));
if ( !is_loadable_phdr(phdr) )
continue;
- if ( phdr->p_vaddr < kernstart )
- kernstart = phdr->p_vaddr;
- if ( (phdr->p_vaddr + phdr->p_memsz) > kernend )
- kernend = phdr->p_vaddr + phdr->p_memsz;
+ if ( phdr->p_paddr < kernstart )
+ kernstart = phdr->p_paddr;
+ if ( (phdr->p_paddr + phdr->p_memsz) > kernend )
+ kernend = phdr->p_paddr + phdr->p_memsz;
}
if ( (kernstart > kernend) ||
for ( done = 0; done < phdr->p_filesz; done += chunksz )
{
- pa = (phdr->p_vaddr + done) - vstart - LINUX_PAGE_OFFSET;
+ pa = (phdr->p_paddr + done) - vstart - LINUX_PAGE_OFFSET;
va = xc_map_foreign_range(
xch, dom, PAGE_SIZE, PROT_WRITE, parray[pa>>PAGE_SHIFT]);
chunksz = phdr->p_filesz - done;
for ( ; done < phdr->p_memsz; done += chunksz )
{
- pa = (phdr->p_vaddr + done) - vstart - LINUX_PAGE_OFFSET;
+ pa = (phdr->p_paddr + done) - vstart - LINUX_PAGE_OFFSET;
va = xc_map_foreign_range(
xch, dom, PAGE_SIZE, PROT_WRITE, parray[pa>>PAGE_SHIFT]);
chunksz = phdr->p_memsz - done;
#ifdef CONFIG_X86
#define FORCE_XENELF_IMAGE 1
-#define ELF_ADDR p_vaddr
#elif defined(__ia64__)
#define FORCE_XENELF_IMAGE 0
-#define ELF_ADDR p_paddr
#endif
static inline int is_loadable_phdr(Elf_Phdr *phdr)
phdr = (Elf_Phdr *)(elfbase + ehdr->e_phoff + (h*ehdr->e_phentsize));
if ( !is_loadable_phdr(phdr) )
continue;
- if ( phdr->ELF_ADDR < kernstart )
- kernstart = phdr->ELF_ADDR;
- if ( (phdr->ELF_ADDR + phdr->p_memsz) > kernend )
- kernend = phdr->ELF_ADDR + phdr->p_memsz;
+ if ( phdr->p_paddr < kernstart )
+ kernstart = phdr->p_paddr;
+ if ( (phdr->p_paddr + phdr->p_memsz) > kernend )
+ kernend = phdr->p_paddr + phdr->p_memsz;
}
if ( (kernstart > kernend) ||
if ( !is_loadable_phdr(phdr) )
continue;
if ( phdr->p_filesz != 0 )
- memcpy((char *)phdr->ELF_ADDR, elfbase + phdr->p_offset,
+ memcpy((char *)phdr->p_paddr, elfbase + phdr->p_offset,
phdr->p_filesz);
if ( phdr->p_memsz > phdr->p_filesz )
- memset((char *)phdr->ELF_ADDR + phdr->p_filesz, 0,
+ memset((char *)phdr->p_paddr + phdr->p_filesz, 0,
phdr->p_memsz - phdr->p_filesz);
}